﻿﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using EventPlanner.Models;
using System.Web.Security;


namespace EventPlanner.Authorization
{

    public class util
    {
        public static Boolean UserIsAdmin(string user)
        {
            if (user == "") return false;
            return EventPlanner.Authorization.util.GetUserRole(user) == "Administrator";
        }

        public static string GetUserRole(string usuario)
        {
            return Roles.GetRolesForUser(usuario).Count() > 0 ? Roles.GetRolesForUser(usuario)[0] : "";
        }

    }

    public class AutorizarCreador : AuthorizeAttribute
    {




        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            EventPlannerContext db = new EventPlannerContext();
            int id = Convert.ToInt32(httpContext.Request.RequestContext.RouteData.Values["id"]);
            Evento evento = db.GetEvento(id);
            if (!evento.IsValid())
                return true; //El evento no existe, lo resuelve el controlador
            string redireccion =
                UrlHelper.GenerateUrl(
                   "Default",
                   "CustomError",
                   "Error",
                   new RouteValueDictionary(new { MensajeError = "El evento fue creado por otro usuario" }),
                   RouteTable.Routes,
                   httpContext.Request.RequestContext,
                   false);
            bool exito = evento.Creador == httpContext.User.Identity.Name || EventPlanner.Authorization.util.UserIsAdmin(httpContext.User.Identity.Name);
            if (!exito)
                httpContext.Response.Redirect(redireccion);
            return exito;
        }
    }
    public class AutorizarCreadorContacto : AuthorizeAttribute
    {



        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            EventPlannerContext db = new EventPlannerContext();
            int id = Convert.ToInt32(httpContext.Request.RequestContext.RouteData.Values["id"]);
            Contacto contacto = db.GetContacto(id);
            if (!contacto.IsValid())
                return true; //El contacto no existe, lo resuelve el controlador
            string redireccion =
                UrlHelper.GenerateUrl(
                   "Default",
                   "CustomError",
                   "Error",
                   new RouteValueDictionary(new { MensajeError = "El contacto fue creado por otro usuario" }),
                   RouteTable.Routes,
                   httpContext.Request.RequestContext,
                   false);
            bool exito = contacto.Creador == httpContext.User.Identity.Name;
            if (!exito)
                httpContext.Response.Redirect(redireccion);
            return exito;
        }
    }
    public class AutorizarCreadorOrganizador : AuthorizeAttribute
    {


        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            EventPlannerContext db = new EventPlannerContext();
            int id = Convert.ToInt32(httpContext.Request.RequestContext.RouteData.Values["id"]);
            Organizador organizador = db.GetOrganizador(id);
            if (!organizador.IsValid())
                return true; //El contacto no existe, lo resuelve el controlador
            string redireccion =
                UrlHelper.GenerateUrl(
                   "Default",
                   "CustomError",
                   "Error",
                   new RouteValueDictionary(new { MensajeError = "El organizador fue creado por otro usuario" }),
                   RouteTable.Routes,
                   httpContext.Request.RequestContext,
                   false);
            bool exito = organizador.Creador == httpContext.User.Identity.Name || EventPlanner.Authorization.util.UserIsAdmin(httpContext.User.Identity.Name); ;
            if (!exito)
                httpContext.Response.Redirect(redireccion);
            return exito;
        }
    }
}